import { Logger } from '@nestjs/common';

/**
 * 定义 `status` 类型，表示一种状态。
 * 该类型限定状态只能为 0 或 1。
 * 0 表示成功，1 表示失败。
 */
type Status = 0 | 1;

enum StatusEnum {
  SUCCESS = 0,
  FAIL = 1,
}

/**
 * R类用于封装响应数据。
 * @template T 数据类型参数。
 */
export default class R<T> {
  status: Status; // 响应状态。
  message: string; // 响应消息。
  data: T; // 响应携带的数据。

  /**
   * 创建一个成功的响应对象。
   * @param {T} data 成功时返回的数据。
   * @param string message 成功时的提示消息，默认为'success'。
   * @returns {R<T>} 返回一个构造好的成功响应对象。
   */
  static success<T>(data: T, message = 'success'): R<T> {
    return new R(StatusEnum.SUCCESS, message, data);
  }

  /**
   * 创建一个失败的响应对象。
   * @param {string} message 失败时的错误消息。
   * @param {T} [data] 失败时可选的返回数据。
   * @returns {R<T>} 返回一个构造好的失败响应对象。
   */
  static fail<T>(message: string, data?: T): R<T> {
    return new R(StatusEnum.FAIL, message, data);
  }

  /**
   * 构造函数，用于初始化响应对象。
   * @param {Status} status 响应状态。
   * @param {string} message 响应消息。
   * @param {T} [data] 响应数据，可选。
   */
  constructor(status: Status, message: string, data?: T) {
    this.status = status;
    this.message = message;
    this.data = data;
  }

  /**
   * 将响应对象转换为字符串。
   * @returns string 返回格式化的响应字符串。
   */
  toString() {
    return `Response{status=${this.status}, message=${this.message}, data=${JSON.stringify(this.data)}}`;
  }
}
